#include <types.h>
#include <kernel/system.h>
#include <kernel/initcall.h>
#include <drivers/irq.h>
#include <drivers/gpio.h>
#include <kernel/syslog.h>
#include <kernel/kobject.h>
#include <drivers/uart.h>
#include <string.h>
#include <kernel/shell.h>
#include <stdio.h>
#include <kernel/fdt.h>
#include <iomode.h>
#include <suniv.h>
#include <io.h>


static void delay(int delay)
{
    for(volatile int i = 0; i<delay; i++)
        for(volatile int j=0;j<10000;j++);
}


void test_exit_handler(void *data)
{
    gpio_toggle_value(IO_PE10);
    char tmp[100];
    sprintf(tmp, "test_exit_handler: %d\r\n", (uint32_t)data);
    SYSLOG_ERROR(tmp);
}


int main(int argc, char **argv) 
{
    int ret = gpio_request(IO_PE10);
    if(ret) {
        SYSLOG_ERROR("gpio request failed\n");
        return -1;
    }

    gpio_direction_output(IO_PE10, 0);

    ret = gpio_request(IO_PE6);
    if(ret) {
        SYSLOG_ERROR("gpio request failed\n");
        return -1;
    }

    gpio_direction_output(IO_PE6, 0);

    ret = gpio_request(IO_PE4);
    if(ret) {
        SYSLOG_ERROR("gpio request failed\n");
        return -1;
    }
    int irq = gpio_to_irq(IO_PE4, IRQF_EDGE);
    if(irq < 0) {
        SYSLOG_ERROR("gpio to irq failed\n");
    }
    irq_request(irq, test_exit_handler, (void*)12456);
    irq_enable(irq);


    SYSLOG_INFO("hello world\r\n");

    while(1) {
        // spl_uart_puts("hello world\r\n");
        // spl_uart_puts(test);
        // gpio_toggle_value(IO_PE10);
        // gpio_toggle_value(IO_PE6);
        // delay(100);
        shell_loop();
    }

    return 0;
}
